#pragma once
#include <future>
#include <optional>
#include "disk_manager.h"
#include "channel.h"
namespace boltDB {
struct DiskRequest {
  // 标记是否是写入
  bool is_write_;
  // 指针用于存放数据，
  char *data_;

  // 要读写的页面id
  page_id_t page_id_;

  //返回值，用于获取请求是否成功
  std::promise<bool> is_ok_;
};

class DiskScheduler {
 public:
  explicit DiskScheduler(DiskManager *disk_manager);
  ~DiskScheduler();

  // 调度函数，就是将任务放进队列里，然后让后台线程执行
  void Schedule(DiskRequest r);

// 开启一个工作线程，不断的从任务队列里面取任务，然后读写
  void StartWorkerThread();

  using DiskSchedulerPromise = std::promise<bool>;

  // 返回一个执行结果
  auto CreatePromise() -> DiskSchedulerPromise { return {}; };

 private:
  DiskManager *disk_manager_ ;
  //请求队列
  Channel<std::optional<DiskRequest>> request_queue_;
 //工作线程
  std::optional<std::thread> background_thread_;
};


}  // namespace boltDB